#ifndef SUPERFICIE_REVOLUCION_H_
#define SUPERFICIE_REVOLUCION_H_

#include "superficie.h"

class Coord;
class Curva;
class Bezier;

class SuperficieRevolucion : public Superficie {
   private:
      const Curva &curvaRevolucion;
      const Curva &curvaPerfil;

   public:
      /*
       * Ni la curva de Revolucion ni la de Perfil, seran apropiadas 
       * ni copiadas por esta clase.
       * Se debe mantener viva la curva de Revolucion y la de Perfil
       * mientras este viva esta instancia.
       *
       * */
      SuperficieRevolucion(const Curva &curvaRevolucion, const Curva &curvaPerfil);

      ~SuperficieRevolucion();

      /*
       * Discretiza la curva de Revolucion y para cada punto discretizado
       * calcula la discretizacion (rotada) de la curva de Perfil
       *
       * La superficie estara centrada en el centro de la curva de Revolucion.
       * Su altura coincidira con la altura de la curva de Perfil, coincidiendo
       * la base del Perfil con el plano z = 0.
       *
       * Precondicion:
       *    0 <= u <= 1
       *    0 <= v <= 1
       *
       * */
      Coord operator()(float u, float v) const;
      Coord eval(float u, float v) const;
      Coord normal(float u, float v) const;

      /*
       * Retorna la altura de la superficie con respecto al eje Z.
       * Dado que se computa la superficie por encima del plano z = 0, 
       * la altura coincide con la coordenada z maxima alcanzada.
       * */
      float altura() const;

      /*
       * Retorna una referencia constante a la curva de revolucion.
       * */
      const Curva& revolucion() const {
         return curvaRevolucion;
      }
      
};

#endif
